pub fn add(left: u64, right: u64) -> u64 {
    left + right
}

pub fn greeting(name: &str) -> String {
    format!("Hello {}!", name)
}

pub fn should_panic() {
    panic!("This test will fail");
}

//单元测试
#[cfg(test)] //当运行cargo test的时候，会自动运行这个模块中的测试
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let result = add(2, 2);
        assert_eq!(result, 4); //等价于下面的代码
        // assert!(result == 4);
    }

    #[test]
    fn it_works2() {
        panic!("This test will fail");
    }
    #[test]
    fn assert_true() {
        assert!(true);
    }
    #[test]
    fn assert_false() {
        assert!(false);
    }
    #[test]
    fn assert_eq() {
        assert_eq!(add(2, 2), 4); //当两边相等的时候通过，否则失败
    }
    #[test]
    fn assert_ne() {
        assert_ne!(add(2, 2), 5); //当两边不相等的时候通过，否则失败
    }
    #[test]
    fn greeting_contains_name() {
        let result = greeting("Carol");
        assert!(result.contains("Carol")); //当result包含"Carol"的时候通过，否则失败
    }
    #[test]
    fn customize_mes() {
        //自定义错误信息
        assert!(false, "This test will fail"); 
        //当调试失败的时候将错误的调试信息输出在终端
    }
    //should_panic测试意味着如果这一块区域没有用panic!宏来触发panic，那么测试就会失败
    #[test]
    #[should_panic]
    fn should_panic() {
        super::should_panic();
    }
    //可以在should_panic的括号中指定期望的错误信息
    //如果错误信息是自己所期望的，就会通过，否则失败
    #[test]
    #[should_panic(expected = "This test will fail")]
    fn should_panic() {
        super::should_panic();
    }
}
